<?php

declare(strict_types=1);

use Hyperf\Server\Event;
use Hyperf\Server\Server;

return [
    'servers' => [
        [
            'name' => 'ws',
            'type' => Server::SERVER_WEBSOCKET,
            'host' => '0.0.0.0',
            'port' => 9503,
            'sock_type' => SWOOLE_SOCK_TCP,
            'settings' => [
                // 启用协程支持
                'enable_coroutine' => true,
                // 指定存储主进程 PID 的文件路径
                'pid_file' => BASE_PATH . '/runtime/hyperf.pid',
                // 启用 TCP Nodelay 选项。
                // 如果设置为 true，会禁用 TCP 的 Nagle 算法，减少延迟，提高网络通信效率。适合需要实时数据传输的场景，例如 WebSocket。
                'open_tcp_nodelay' => true,
                // 最大协程数量
                // 设置允许的最大协程数量。协程是轻量级的线程，数量过多可能会影响系统性能和内存使用。
                // 需要根据实际应用的并发需求和系统资源来调整。
                'max_coroutine' => 100000,
                // 每个进程最大请求数
                // 设置每个进程在重启之前可以处理的最大请求数。
                // 达到该数量后，Swoole 会重启进程以释放内存。对于长时间运行的进程，这可以防止内存泄漏。
                'max_request' => 100000,
                // 设置服务器最大允许的客户端连接数。这个值决定服务器最多能同时接入的连接数。
                'max_connection' => 100000,
                // 设置套接字的缓冲区大小
                // 定义套接字的读写缓冲区大小。大缓冲区可以提高数据处理能力，但也会占用更多的内存。
                // 2 * 1024 * 1024 字节（即 2MB）是一个常见的设置值，可以根据实际需要调整。
                'socket_buffer_size' => 2 * 1024 * 1024,
                // 设置 Worker 进程的数量。每个 Worker 进程处理请求的并发数越多，则可以更好地利用多核 CPU。
                'worker_num' => 1,
                // 设置 Task 进程的数量。Task 进程用于处理耗时的任务，比如异步任务。为 0 表示不启用 Task 进程。
                'task_worker_num' => 0,
                // 设置输出缓存区的大小，单位为字节。表示服务器发送给客户端的数据缓存区大小。
//                'output_buffer_size' => 4294967295,
                // 启用 HTTP 协议支持。如果设为 false，服务器将不处理 HTTP 请求（但仍然可以处理 WebSocket 请求）。
                'open_http_protocol' => false,
                // 启用 WebSocket 协议支持。如果设为 false，服务器将不处理 WebSocket 连接。
                'open_websocket_protocol' => true,
                // 虽然 Hyperf WebSocket 默认不需要手动配置心跳，但在高并发或者需要长时间保持连接的应用场景下，
                // 合理配置 heartbeat_check_interval 和 heartbeat_idle_time 是有必要的。
                // 这样可以有效避免连接资源长期占用，提升服务器的健壮性和性能。
                // 每60秒检查一次心跳
//                'heartbeat_check_interval' => 60,
                // 连接超过300秒没有数据交互则关闭
//                'heartbeat_idle_time' => 300,
            ],
            'callbacks' => [
                Event::ON_START => [App\Websocket\WebSocketEventHandler::class, 'onStart'],
                Event::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'],
                Event::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'],
                Event::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'],
            ],
        ],
    ],
    /**
     * 必须是 SWOOLE_BASE 或 SWOOLE_PROCESS 。从 Swoole 5.0.0 开始，默认的服务器模式已从 SWOOLE_PROCESS 更改为 SWOOLE_BASE 。
     * @see vendor/swoole/ide-helper/src/swoole/Swoole/Server.php __construct() 208
     */
    'mode' => SWOOLE_BASE,
];
